package ar.org.tesis.comparticion.conocimientos.dao.hbn;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;

import ar.org.tesis.comparticion.conocimientos.dao.EjecucionSiaDAO;
import ar.org.tesis.comparticion.conocimientos.informacion.beans.EjecucionSiaBean;

/**
 * @author Marcelo
 *
 */
@SuppressWarnings("serial")
public class EjecucionSiaDAOHbn extends AbstractDAOHbn implements
		EjecucionSiaDAO {
	
	private static final Logger logger = Logger.getLogger(EjecucionSiaDAOHbn.class);

	public EjecucionSiaDAOHbn() {
		// TODO Auto-generated constructor stub
	}
	
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public Integer buscarMaxEjecucionNro(final Integer id){
		logger.info("inicio buscarMaxEjecucionNro");
		List<EjecucionSiaBean> list=null;
		try{
			final String queryStr = "FROM EjecucionSiaBean " +
					"WHERE id=:idIn";

		list = getHibernateTemplate().execute(
				new HibernateCallback() {
				public Object doInHibernate(Session session) throws HibernateException {
				Query query =session.createQuery(queryStr);
				
				query.setInteger("idIn", id);

				return query.list();
				}});
		
		
		}catch(HibernateException e){
			logger.error(e);
		}finally{
			logger.info("fin buscarMaxEjecucionNro");
		}
		if(list==null)
			return 1;
		return list.size()+1;
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public EjecucionSiaBean buscarMaxEjecucionSiaBean(final Integer id){
		logger.info("inicio buscarMaxEjecucionSiaBean");
		EjecucionSiaBean ejecucionSiaBean=null;
		try{
		final String queryStr="SELECT id_ejecucion_sia, cant_teorias_exitosas, cant_teorias_nuevas, cant_teorias_pr_col, ejecucion_sia_index, " +
		"id_ejecucion_sia, id_sia_estado_evolucion_world,ejecucion_nro, max(cant_teorias_exitosas) as cant_teorias_exitosas FROM EJECUCION_SIA " +
		"WHERE id_sia_estado_evolucion_world=:id GROUP BY id_ejecucion_sia, ejecucion_nro, cant_teorias_nuevas, cant_teorias_pr_col, " +
		"ejecucion_sia_index, id_ejecucion_sia, id_sia_estado_evolucion_world";
		
		ejecucionSiaBean = getHibernateTemplate().execute(
				new HibernateCallback() {
				public Object doInHibernate(Session session) throws HibernateException {
				SQLQuery query =session.createSQLQuery(queryStr);
				query.addEntity(EjecucionSiaBean.class);
				
				query.setInteger("id", id);

				return query.uniqueResult();
				}});
		
		
		}catch(HibernateException e){
			logger.error(e);
		}finally{
			logger.info("fin buscarMaxEjecucionSiaBean");
		}
		return ejecucionSiaBean;
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public EjecucionSiaBean buscarMinEjecucionSiaBean(final Integer id){
		logger.info("inicio buscarMinEjecucionSiaBean");
		EjecucionSiaBean ejecucionSiaBean=null;
		try{
		final String queryStr="SELECT id_ejecucion_sia, cant_teorias_exitosas, cant_teorias_nuevas, cant_teorias_pr_col, ejecucion_sia_index, " +
		"id_ejecucion_sia, id_sia_estado_evolucion_world,ejecucion_nro, min(cant_teorias_exitosas) as cant_teorias_exitosas FROM EJECUCION_SIA " +
		"WHERE id_sia_estado_evolucion_world=:id GROUP BY id_ejecucion_sia, ejecucion_nro, cant_teorias_nuevas, cant_teorias_pr_col, " +
		"ejecucion_sia_index, id_ejecucion_sia, id_sia_estado_evolucion_world";
		
		ejecucionSiaBean = getHibernateTemplate().execute(
				new HibernateCallback() {
				public Object doInHibernate(Session session) throws HibernateException {
				SQLQuery query =session.createSQLQuery(queryStr);
				query.addEntity(EjecucionSiaBean.class);
				
				query.setInteger("id", id);

				return query.uniqueResult();
				}});
		}catch(HibernateException e){
			logger.error(e);
		}finally{
			logger.info("fin buscarMinEjecucionSiaBean");
		}
		
		return ejecucionSiaBean;
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public EjecucionSiaBean buscarAvgTNuevasEjecucionSiaBean(final Integer id){
		logger.info("inicio buscarAvgTNuevasEjecucionSiaBean");
		EjecucionSiaBean ejecucionSiaBean=null;
		try{
		final String queryStr="SELECT id_ejecucion_sia, cant_teorias_exitosas, avg(cant_teorias_nuevas)as cant_teorias_nuevas, cant_teorias_pr_col, ejecucion_sia_index, " +
		"id_ejecucion_sia, id_sia_estado_evolucion_world,ejecucion_nro, cant_teorias_exitosas FROM EJECUCION_SIA " +
		"WHERE id_sia_estado_evolucion_world=:id GROUP BY id_ejecucion_sia, ejecucion_nro, cant_teorias_exitosas, cant_teorias_pr_col, " +
		"ejecucion_sia_index, id_ejecucion_sia, id_sia_estado_evolucion_world";
			
		ejecucionSiaBean = getHibernateTemplate().execute(
				new HibernateCallback() {
				public Object doInHibernate(Session session) throws HibernateException {
				SQLQuery query =session.createSQLQuery(queryStr);
				query.addEntity(EjecucionSiaBean.class);
				
				query.setInteger("id", id);

				return query.uniqueResult();
				}});
		}catch(HibernateException e){
			logger.error(e);
		}finally{
			logger.info("fin buscarAvgTNuevasEjecucionSiaBean");
		}
		return ejecucionSiaBean;
	}
	

}
